#include "bsp_usb.h"
#include "bsp_ec600.h"
#include "bsp_flash.h"
#include <string.h>
USB_structure USB;
USB_MSG USB_msg;


/***********************************************************************************************************
函数名称 ： USB_Init
功    能 ：接口初始化,就是初始化串口
参    数 ： 无
返 回 值 ： 无
作    者 ： FlySnail
***********************************************************************************************************/
void USB_Init(void)
{
	USART2_Init();    		// USB配置串口	，波特率115200
}


/***********************************************************************************************************
函数名称 ： USB_RecvHandle
功    能 ：数据接收方法，放到对应串口中断
参    数 ： data  - 串口接收到的数据
返 回 值 ： 无
作    者 ： FlySnail
***********************************************************************************************************/
void USB_RecvHandle(uint8_t data)
{
	USB.Parse_flag = USB_Parse(data,&USB_msg);
}
/**************************************************** 
*数据解析
FE 0C 10 03 E6 95 99 E5 AD A6 E6 A5 BC 20 C6
****************************************************/
static uint8_t USB_msgStat=0;  
static uint16_t USB_msgIndex=0;
uint8_t USB_fsc=0;

uint8_t USB_parseData[USB_DATA_LEN]={0},USB_reFlag=0;
uint16_t USB_reIndex=0;  // 消息帧解析的缓存
uint16_t USB_dataLenTemp=0; // 临时记录数据长度
uint8_t USB_Parse(uint8_t data,USB_MSG *USB_msg)
{
	uint8_t parse=0;
  switch (++USB_msgStat)
	{
	  case USB_MSG_HEAD:
		{
		  if(data==0xFE)
			{
			  USB_msg->USB_head = data;
			  USB_msgIndex = 0;
				USB_msg->USB_len = 0;
			}
			else USB_msgStat = USB_MSG_IDEL;
		  break;
		}
		case USB_MSG_LEN:
		{
		  USB_msg->USB_len = USB_msg->USB_len + data;
		  break;
		}
		case USB_MSG_TYPE:
		{
		  USB_msg->USB_type = data;
			USB_fsc+=data;
			break;
		}
		case USB_MSG_TYPE_CONFIG:
		{
		  USB_msg->USB_type_Config = data;
		  USB_fsc+=data;
			break;
		}	
		case USB_MSG_PAYLOAD:
		{
		  USB_msg->USB_buff[USB_msgIndex] = data;
			USB_fsc+=data;
			USB_msgIndex++;
			if(USB_msgIndex==USB_msg->USB_len-2)  USB_msgStat = USB_MSG_PAYLOAD;  //接收完成跳往下一步
			else                                  USB_msgStat = USB_MSG_TYPE_CONFIG;     //接收未完成继续接收
		  break;
		}
		case USB_MSG_fsc:
		{
			USB_msgIndex = 0;
		  if(USB_fsc==data)
			{
				USB_msg->USB_FSC = data;
				USB_fsc = 0;
				USB.index = 0;;
			  parse = 1;
			}
			else 
			{
			  parse = 0;
			}
			USB_msgStat = USB_MSG_IDEL;
		}
	}
	return parse;
}
/**************************************************** 
*USB功能函数
FE 0C 10 03 E6 95 99 E5 AD A6 E6 A5 BC 20 C6    地址名字
FE 0B 10 01 67 2E 80 35 66 88 00 00 49          IP和端口
****************************************************/
void USB_FUNCTION(void)
{
	if(USB.Parse_flag==1)        //解析完成
	{
		USB.Parse_flag = 0;
	  switch (USB_msg.USB_type_Config)         //type位
		{
		  case 0x01:
			{
		  	for(uint8_t i=0;i<USB_msg.USB_len-2;i++)
		    {
		      USB.servrIP[i] = USB_msg.USB_buff[i];
		    }
				USB.port = (USB_msg.USB_buff[4]<<8 | USB_msg.USB_buff[5]) & 0x0000ffff;
				USB.servrIP[4] = USB.port;    //组合在一起  传入HTTP这个数组
				USB.state = IP_Set;
				sprintf(ec600.serverIp,"%d.%d.%d.%d",USB.servrIP[0],USB.servrIP[1],USB.servrIP[2],USB.servrIP[3]);
				ec600.serverPort = USB.servrIP[4];
				sendInterval = USB.interval_time;
				dataSendInterval = sendInterval*1000;
				Save_IPandPort(USB.servrIP, 5);
			}break;
			case 0x02:
			{
				memset(USB.Address_number,0,strlen(USB.Address_number));
				USB.number_len = USB_msg.USB_len-2;    //name数据字节数
				USB.Address_number[0] = USB.number_len;
			  for(uint8_t i=0;i<USB_msg.USB_len-2;i++)     //接收地址编码
			  {
			    USB.Address_number[i+1] = USB_msg.USB_buff[i];    //第0位保存的数据长度，所有数据后移一位
			  }	
				USB.state = number_Set;	
				Flash_writeDATA(FLASH_USB_numberlen_ADDR,&USB_msg.USB_len);  //保存地址编码长度			
				Save_USBnumber(USB.Address_number,USB.number_len+1);               //保存number
				dataSendInterval = sendInterval*1000;
			}break;
			case 0x03:
			{
				memset(USB.Address_name,0,strlen(USB.Address_name));
			  USB.name_len = USB_msg.USB_len-2;    //name数据字节数
				USB.Address_name[0] = USB.name_len;
			  for(uint8_t i=0;i<USB_msg.USB_len-2;i++)     //接收地址名字
			  {
			    USB.Address_name[i+1] = USB_msg.USB_buff[i];
				} 
				Flash_writeDATA(FLASH_USB_namelen_ADDR,&USB_msg.USB_len);  ////保存地址名字长度
			  Save_USBname(USB.Address_name,USB.name_len+1);   //多一位保存数据长度
				dataSendInterval = sendInterval*1000;
			}
			case 0x04:
			{
				USB.time[0] = (USB_msg.USB_buff[0]<<8|USB_msg.USB_buff[1])&0xffff;
				USB.interval_time = USB.time[0];
				sendInterval = USB.interval_time;
			  Save_USBtime(USB.time,1);  
				dataSendInterval = sendInterval*1000;
			}
		}
	}
}

/************************************************
函数名称 ： uint8_t HTTP_requestLenth
功    能 ： 计算http请求数据的字符串长度
参    数 ： 1，地址编码  2，地址名字  3，电能数据数组  4电能数据长度 5,SIM卡号   
返 回 值 ： 长度
*************************************************/
uint8_t HTTP_requestLenth(char *buf, uint8_t *Address_number,uint8_t *Address_name,uint8_t *electricEnergyBUF,uint8_t len,uint8_t *SIMCODE)
{
	uint32_t DATA=0;
  uint8_t Lenth=0;
  char temp_char[USB_temp_LEN];
	char temp[USB_temp_LEN]; //临时地址编码
	char temp1[USB_temp_LEN]; //临时地址名字
	char temp2[USB_temp_LEN]; //临时电能数据
	char temp3[USB_temp_LEN];

	memset(buf,0,strlen(buf));
	
	  	for (uint8_t i=0;i<len;i++)
	{
    DATA += (electricEnergyBUF[i]>>4 & 0x0f)*10+(electricEnergyBUF[i] & 0x0f);
       if(i<len-1)
	   {DATA*=100;}
	}
	USB.electricEnergy= DATA;
	if(USB.state==number_Set){
		sprintf(temp,"{\"pointCode\":\"%s\",",Address_number);
	}
	else{
		sprintf(temp,"{\"pointCode\":\"%s\",",SIMCODE);          
	}
	memcpy(buf+strlen(buf),temp,strlen(temp));	

	sprintf(temp1,"\"pointName\":\"%s\",",Address_name);
	memcpy(buf+strlen(buf),temp1,strlen(temp1));
	
	sprintf(temp2,"\"energy\":%0.2f}",USB.electricEnergy/100.0f);   
	memcpy(buf+strlen(buf),temp2,strlen(temp2));

	Lenth = strlen(buf);
	
  return Lenth;
}

void Save_IPandPort(uint32_t * data,uint8_t len)
{
	char IP[USB_temp_LEN];
	sprintf(IP,"%d.%d.%d.%d",USB.servrIP[0],USB.servrIP[1],USB.servrIP[2],USB.servrIP[3]);
	Flash_writeBuf(FLASH_ipSAVE_ADDR, data, len);

}

void Read_IPandPort(uint32_t * data,uint8_t len)
{
	FLASH_Read(FLASH_ipSAVE_ADDR, data, len);
}

void Save_USBnumber(uint8_t *data,uint8_t len)
{
	  Flash_writeBuf(FLASH_number_ADDR,(uint32_t *)data,len);  //USB.Address_number_len
}

void Save_USBname(uint8_t *data,uint8_t len)
{
	Flash_writeBuf(FLASH_name_ADDR,(uint32_t *)data,len);     //USB.Address_name_len
}

void Save_USBtime(uint16_t *data,uint8_t len)
{
	Flash_writeBuf(FLASH_time_ADDR,(uint32_t *)data,len);     //USB.Address_name_len
}

void Read_USBnumber(uint32_t * data,uint32_t len)
{
  FLASH_Read(FLASH_number_ADDR,data,len);
	if(USB.Address_number[0]>0)  //判断是否保存过数据  第0位保存的是长度
	{
    USB.state = number_Set;   //获取到了则标志number已经获取
	}
	else
	{
    USB.state = USBNULL;
	}
}

void Read_USBname(uint32_t * data,uint32_t len)
{
  FLASH_Read(FLASH_name_ADDR,data,len);	   
	if(USB.Address_name[0]>0)  //判断是否保存过数据
	{
	}
	else
	{
	  memset(USB.Address_name, 0, USB_DATA_LEN);   //如果没有保存过，直接删掉数组
	}
}

void Read_USBtime(uint32_t * data,uint32_t len)
{
  FLASH_Read(FLASH_time_ADDR,data,len);	   
}

